{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deep NN on MNIST using TensorFlow\n",
    "#### A high-level tutorial into Deep Learning using MNIST data and TensorFlow library.\n",
    "by [@kakauandme](https://twitter.com/KaKaUandME) and [@thekoshkina](https://twitter.com/thekoshkina)\n",
    "\n",
    "Accuracy: 0.99\n",
    "\n",
    "\n",
    "**Prerequisites:** fundamental coding skills, a bit of linear algebra, especially matrix operations and perhaps understanding how images are stored in computer memory. To start with machine learning, we suggest [coursera course](https://www.coursera.org/learn/machine-learning) by Andrew Ng.\n",
    "\n",
    "\n",
    "Note: \n",
    "\n",
    "*Feel free to fork and adjust* CONSTANTS *to tweak network behaviour and explore how it changes algorithm performance and accuracy. Besides **TensorFlow graph** section can also be modified for learning purposes.*\n",
    "\n",
    "*It is highly recommended printing every variable that isn’t 100% clear for you. Also, [tensorboard](https://www.tensorflow.org/versions/master/how_tos/summaries_and_tensorboard/index.html) can be used on a local environment for visualisation and debugging.*\n",
    "## Libraries and settings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.cm as cm\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "# settings\n",
    "LEARNING_RATE = 1e-4\n",
    "TRAINING_ITERATIONS = 20000    \n",
    "    \n",
    "DROPOUT = 0.5\n",
    "BATCH_SIZE = 50\n",
    "\n",
    "# set to 0 to train on all available data\n",
    "VALIDATION_SIZE = 2000\n",
    "\n",
    "# image number to output\n",
    "IMAGE_TO_DISPLAY = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preparation\n",
    "To start, we read provided data. The **`train.csv`** file contains 42000 rows and 785 columns. Each row represents an image of a handwritten digit and a label with the value of this digit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data(42000,785)\n",
      "   label  pixel0  pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  \\\n",
      "0      1       0       0       0       0       0       0       0       0   \n",
      "1      0       0       0       0       0       0       0       0       0   \n",
      "2      1       0       0       0       0       0       0       0       0   \n",
      "3      4       0       0       0       0       0       0       0       0   \n",
      "4      0       0       0       0       0       0       0       0       0   \n",
      "\n",
      "   pixel8    ...     pixel774  pixel775  pixel776  pixel777  pixel778  \\\n",
      "0       0    ...            0         0         0         0         0   \n",
      "1       0    ...            0         0         0         0         0   \n",
      "2       0    ...            0         0         0         0         0   \n",
      "3       0    ...            0         0         0         0         0   \n",
      "4       0    ...            0         0         0         0         0   \n",
      "\n",
      "   pixel779  pixel780  pixel781  pixel782  pixel783  \n",
      "0         0         0         0         0         0  \n",
      "1         0         0         0         0         0  \n",
      "2         0         0         0         0         0  \n",
      "3         0         0         0         0         0  \n",
      "4         0         0         0         0         0  \n",
      "\n",
      "[5 rows x 785 columns]\n"
     ]
    }
   ],
   "source": [
    "# read training data from CSV file \n",
    "data = pd.read_csv('./input/train.csv')\n",
    "\n",
    "print('data({0[0]},{0[1]})'.format(data.shape))\n",
    "print (data.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Every image is a \"stretched\" array of pixel values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "images(42000,784)\n"
     ]
    }
   ],
   "source": [
    "images = data.iloc[:,1:].values\n",
    "images = images.astype(np.float)\n",
    "\n",
    "# convert from [0:255] => [0.0:1.0]\n",
    "images = np.multiply(images, 1.0 / 255.0)\n",
    "\n",
    "print('images({0[0]},{0[1]})'.format(images.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this case it's 784 pixels => 28 * 28px "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "image_size => 784\n",
      "image_width => 28\n",
      "image_height => 28\n"
     ]
    }
   ],
   "source": [
    "image_size = images.shape[1]\n",
    "print ('image_size => {0}'.format(image_size))\n",
    "\n",
    "# in this case all images are square\n",
    "image_width = image_height = np.ceil(np.sqrt(image_size)).astype(np.uint8)\n",
    "\n",
    "print ('image_width => {0}\\nimage_height => {1}'.format(image_width,image_height))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To output one of the images, we reshape this long string of pixels into a 2-dimensional array, which is basically a grayscale image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n7kSDNKPylHIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x109ee6828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# display image\n",
    "def display(img):\n",
    "    \n",
    "    # (784) => (28,28)\n",
    "    one_image = img.reshape(image_width,image_height)\n",
    "    \n",
    "    plt.axis('off')\n",
    "    plt.imshow(one_image, cmap=cm.binary)\n",
    "\n",
    "# output image     \n",
    "display(images[IMAGE_TO_DISPLAY])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The corresponding labels are numbers between 0 and 9, describing which digit a given image is of."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "labels_flat(42000)\n",
      "labels_flat[10] => 8\n"
     ]
    }
   ],
   "source": [
    "labels_flat = data[[0]].values.ravel()\n",
    "\n",
    "print('labels_flat({0})'.format(len(labels_flat)))\n",
    "print ('labels_flat[{0}] => {1}'.format(IMAGE_TO_DISPLAY,labels_flat[IMAGE_TO_DISPLAY]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this case, there are ten different digits/labels/classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "labels_count => 10\n"
     ]
    }
   ],
   "source": [
    "labels_count = np.unique(labels_flat).shape[0]\n",
    "\n",
    "print('labels_count => {0}'.format(labels_count))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For most classification problems \"one-hot vectors\" are used. A one-hot vector is a vector that contains a single element equal to 1 and the rest of the elements equal to 0. In this case, the **`n`**th digit is represented as a zero vector with 1 in the **`n`**th position."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "labels(42000,10)\n",
      "labels[10] => [0 0 0 0 0 0 0 0 1 0]\n"
     ]
    }
   ],
   "source": [
    "# convert class labels from scalars to one-hot vectors\n",
    "# 0 => [1 0 0 0 0 0 0 0 0 0]\n",
    "# 1 => [0 1 0 0 0 0 0 0 0 0]\n",
    "# ...\n",
    "# 9 => [0 0 0 0 0 0 0 0 0 1]\n",
    "def dense_to_one_hot(labels_dense, num_classes):\n",
    "    num_labels = labels_dense.shape[0]\n",
    "    index_offset = np.arange(num_labels) * num_classes\n",
    "    labels_one_hot = np.zeros((num_labels, num_classes))\n",
    "    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1\n",
    "    return labels_one_hot\n",
    "\n",
    "labels = dense_to_one_hot(labels_flat, labels_count)\n",
    "labels = labels.astype(np.uint8)\n",
    "\n",
    "print('labels({0[0]},{0[1]})'.format(labels.shape))\n",
    "print ('labels[{0}] => {1}'.format(IMAGE_TO_DISPLAY,labels[IMAGE_TO_DISPLAY]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lastly we set aside data for validation. It's essential in machine learning to have a separate dataset which doesn't take part in the training and is used to make sure that what we've learned can actually be generalised.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_images(40000,784)\n",
      "validation_images(2000,784)\n"
     ]
    }
   ],
   "source": [
    "# split data into training & validation\n",
    "validation_images = images[:VALIDATION_SIZE]\n",
    "validation_labels = labels[:VALIDATION_SIZE]\n",
    "\n",
    "train_images = images[VALIDATION_SIZE:]\n",
    "train_labels = labels[VALIDATION_SIZE:]\n",
    "\n",
    "\n",
    "print('train_images({0[0]},{0[1]})'.format(train_images.shape))\n",
    "print('validation_images({0[0]},{0[1]})'.format(validation_images.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Data is ready. The neural network structure is next.*\n",
    "## TensorFlow graph\n",
    "TensorFlow does its heavy lifting outside Python. Therefore, instead of running every single operation independently, TensorFlow allows users to build a whole graph of interacting operations and then runs the workflow in a separate process at once.\n",
    "#### Helper functions\n",
    "For this NN model, a lot of weights and biases are created. Generally, weights should be initialised with a small amount of noise for symmetry breaking, and to prevent 0 gradients. \n",
    "\n",
    "Since we are using [ReLU](https://en.wikipedia.org/wiki/Rectifier_(neural_networks) neurones (ones that contain rectifier function **`f(x)=max(0,x)`**), it is also good practice to initialise them with a slightly positive initial bias to avoid \"dead neurones\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# weight initialization\n",
    "def weight_variable(shape):\n",
    "    initial = tf.truncated_normal(shape, stddev=0.1)\n",
    "    return tf.Variable(initial)\n",
    "\n",
    "def bias_variable(shape):\n",
    "    initial = tf.constant(0.1, shape=shape)\n",
    "    return tf.Variable(initial)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For this problem we use zero padded [convolutions](https://en.wikipedia.org/wiki/Convolutional_neural_network#Convolutional_layer) so that the output is the same size as the input. Stride/step in this case is equal to 1.\n",
    "\n",
    "In general, convolution layer is used to get the features of the data.  In the case of digit recognition - a shape of each digit.  It uses learnable kernels/filters each of which corresponds to one particular shape pattern. The number of the filter can be different for other problems."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# convolution\n",
    "def conv2d(x, W):\n",
    "    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Pooling](https://en.wikipedia.org/wiki/Convolutional_neural_network#Pooling_layer) is plain max pooling over 2x2 blocks.\n",
    "\n",
    "Pooling is used for downsampling of the data. 2x2 max-pooling splits the image into square 2-pixel blocks and only keeps maximum value for each of those blocks. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# pooling\n",
    "# [[0,3],\n",
    "#  [4,2]] => 4\n",
    "\n",
    "# [[0,1],\n",
    "#  [1,1]] => 1\n",
    "\n",
    "def max_pool_2x2(x):\n",
    "    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*We'll get back to convolutions and pooling in more detail below.*\n",
    "\n",
    "The good thing about neural networks that any NN can be used as a layer in a large multilayer NN meaning that output of one can be used as input for another. This sequential approach can create very sophisticated NN with multiple layers. They are also called Deep Neural Networks.\n",
    "\n",
    "In this case, we use two convolution layers with pooling in between them, then densely connected layer followed by dropout and lastly readout layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# input & output of NN\n",
    "\n",
    "# images\n",
    "x = tf.placeholder('float', shape=[None, image_size])\n",
    "# labels\n",
    "y_ = tf.placeholder('float', shape=[None, labels_count])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first layer is a convolution, followed by max pooling. The convolution computes 32 features for each 5x5 patch. Its weight tensor has a shape of [5, 5, 1, 32]. The first two dimensions are the patch size, the next is the number of input channels (1 means that images are grayscale), and the last is the number of output channels. There is also a bias vector with a component for each output channel.\n",
    "\n",
    "To apply the layer, we reshape the input data to a 4d tensor, with the first dimension corresponding to the number of images, second and third - to image width and height, and the final dimension - to the number of colour channels.\n",
    "\n",
    "After the convolution, pooling reduces the size of the output from 28x28 to 14x14."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# first convolutional layer\n",
    "W_conv1 = weight_variable([5, 5, 1, 32])\n",
    "b_conv1 = bias_variable([32])\n",
    "\n",
    "# (40000,784) => (40000,28,28,1)\n",
    "image = tf.reshape(x, [-1,image_width , image_height,1])\n",
    "#print (image.get_shape()) # =>(40000,28,28,1)\n",
    "\n",
    "\n",
    "h_conv1 = tf.nn.relu(conv2d(image, W_conv1) + b_conv1)\n",
    "#print (h_conv1.get_shape()) # => (40000, 28, 28, 32)\n",
    "h_pool1 = max_pool_2x2(h_conv1)\n",
    "#print (h_pool1.get_shape()) # => (40000, 14, 14, 32)\n",
    "\n",
    "\n",
    "# Prepare for visualization\n",
    "# display 32 fetures in 4 by 8 grid\n",
    "layer1 = tf.reshape(h_conv1, (-1, image_height, image_width, 4 ,8))  \n",
    "\n",
    "# reorder so the channels are in the first dimension, x and y follow.\n",
    "layer1 = tf.transpose(layer1, (0, 3, 1, 4,2))\n",
    "\n",
    "layer1 = tf.reshape(layer1, (-1, image_height*4, image_width*8)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The second layer has 64 features for each 5x5 patch. Its weight tensor has a shape of [5, 5, 32, 64]. The first two dimensions are the patch size, the next is the number of input channels (32 channels correspond to 32 featured that we got from previous convolutional layer), and the last is the number of output channels. There is also a bias vector with a component for each output channel.\n",
    "\n",
    "Because the image is down-sampled by pooling to 14x14 size second convolutional layer picks up more general characteristics of the images. Filters cover more space of the picture. Therefore, it is adjusted for more generic features while the first layer finds smaller details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# second convolutional layer\n",
    "W_conv2 = weight_variable([5, 5, 32, 64])\n",
    "b_conv2 = bias_variable([64])\n",
    "\n",
    "h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)\n",
    "#print (h_conv2.get_shape()) # => (40000, 14,14, 64)\n",
    "h_pool2 = max_pool_2x2(h_conv2)\n",
    "#print (h_pool2.get_shape()) # => (40000, 7, 7, 64)\n",
    "\n",
    "# Prepare for visualization\n",
    "# display 64 fetures in 4 by 16 grid\n",
    "layer2 = tf.reshape(h_conv2, (-1, 14, 14, 4 ,16))  \n",
    "\n",
    "# reorder so the channels are in the first dimension, x and y follow.\n",
    "layer2 = tf.transpose(layer2, (0, 3, 1, 4,2))\n",
    "\n",
    "layer2 = tf.reshape(layer2, (-1, 14*4, 14*16)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the image size is reduced to 7x7, we add a [fully-connected layer](https://en.wikipedia.org/wiki/Convolutional_neural_network#Fully_Connected_layer) with 1024 neurones to allow processing on the entire image (each of the neurons of the fully connected layer is connected to all the activations/outpus of the previous layer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# densely connected layer\n",
    "W_fc1 = weight_variable([7 * 7 * 64, 1024])\n",
    "b_fc1 = bias_variable([1024])\n",
    "\n",
    "# (40000, 7, 7, 64) => (40000, 3136)\n",
    "h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])\n",
    "\n",
    "h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)\n",
    "#print (h_fc1.get_shape()) # => (40000, 1024)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To prevent overfitting, we  apply [dropout](https://en.wikipedia.org/wiki/Convolutional_neural_network#Dropout) before the readout layer.\n",
    "\n",
    "Dropout removes some nodes from the network at each training stage. Each of the nodes is either kept in the network with probability **`keep_prob`** or dropped with probability **`1 - keep_prob`**. After the training stage is over the nodes are returned to the NN with their original weights."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# dropout\n",
    "keep_prob = tf.placeholder('float')\n",
    "h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we add a softmax layer, the same one if we use just a  simple [softmax regression](https://en.wikipedia.org/wiki/Softmax_function)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# readout layer for deep net\n",
    "W_fc2 = weight_variable([1024, labels_count])\n",
    "b_fc2 = bias_variable([labels_count])\n",
    "\n",
    "y = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)\n",
    "\n",
    "#print (y.get_shape()) # => (40000, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To evaluate network performance we use [cross-entropy](https://en.wikipedia.org/wiki/Cross_entropy) and to minimise it [ADAM optimiser](http://arxiv.org/pdf/1412.6980v8.pdf) is used. \n",
    "\n",
    "ADAM optimiser is a gradient based optimization algorithm, based on adaptive estimates, it's more sophisticated than steepest gradient descent and is well suited for problems with large data or many parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# cost function\n",
    "cross_entropy = -tf.reduce_sum(y_*tf.log(y))\n",
    "\n",
    "\n",
    "# optimisation function\n",
    "train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(cross_entropy)\n",
    "    \n",
    "# evaluation\n",
    "correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))\n",
    "\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To predict values from test data, highest probability is picked from \"one-hot vector\" indicating that chances of  an image being one of the digits are highest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prediction function\n",
    "#[0.1, 0.9, 0.2, 0.1, 0.1 0.3, 0.5, 0.1, 0.2, 0.3] => 1\n",
    "predict = tf.argmax(y,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Finally neural network structure is defined and TensorFlow graph is ready for training.*\n",
    "## Train, validate and predict\n",
    "#### Helper functions\n",
    "\n",
    "Ideally, we should use all data for every step of the training, but that's expensive. So, instead, we use small \"batches\" of random data. \n",
    "\n",
    "This method is called [stochastic training](https://en.wikipedia.org/wiki/Stochastic_gradient_descent). It is cheaper, faster and gives much of the same result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "epochs_completed = 0\n",
    "index_in_epoch = 0\n",
    "num_examples = train_images.shape[0]\n",
    "\n",
    "# serve data by batches\n",
    "def next_batch(batch_size):\n",
    "    \n",
    "    global train_images\n",
    "    global train_labels\n",
    "    global index_in_epoch\n",
    "    global epochs_completed\n",
    "    \n",
    "    start = index_in_epoch\n",
    "    index_in_epoch += batch_size\n",
    "    \n",
    "    # when all trainig data have been already used, it is reorder randomly    \n",
    "    if index_in_epoch > num_examples:\n",
    "        # finished epoch\n",
    "        epochs_completed += 1\n",
    "        # shuffle the data\n",
    "        perm = np.arange(num_examples)\n",
    "        np.random.shuffle(perm)\n",
    "        train_images = train_images[perm]\n",
    "        train_labels = train_labels[perm]\n",
    "        # start next epoch\n",
    "        start = 0\n",
    "        index_in_epoch = batch_size\n",
    "        assert batch_size <= num_examples\n",
    "    end = index_in_epoch\n",
    "    return train_images[start:end], train_labels[start:end]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now when all operations for every variable are defined in TensorFlow graph all computations will be performed outside Python environment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# start TensorFlow session\n",
    "init = tf.initialize_all_variables()\n",
    "sess = tf.InteractiveSession()\n",
    "\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each step of the loop, we get a \"batch\" of data points from the training set and feed it to the graph to replace the placeholders.  In this case, it's:  *x, y* and *dropout.*\n",
    "\n",
    "Also, once in a while, we check training accuracy on an upcoming \"batch\".\n",
    "\n",
    "On the local environment, we recommend [saving training progress](https://www.tensorflow.org/versions/master/api_docs/python/state_ops.html#Saver), so it can be recovered for further training, debugging or evaluation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "training_accuracy / validation_accuracy => 0.08 / 0.06 for step 0\n",
      "training_accuracy / validation_accuracy => 0.18 / 0.18 for step 1\n",
      "training_accuracy / validation_accuracy => 0.24 / 0.18 for step 2\n",
      "training_accuracy / validation_accuracy => 0.18 / 0.22 for step 3\n",
      "training_accuracy / validation_accuracy => 0.18 / 0.14 for step 4\n",
      "training_accuracy / validation_accuracy => 0.20 / 0.28 for step 5\n",
      "training_accuracy / validation_accuracy => 0.38 / 0.44 for step 6\n",
      "training_accuracy / validation_accuracy => 0.34 / 0.36 for step 7\n",
      "training_accuracy / validation_accuracy => 0.30 / 0.46 for step 8\n",
      "training_accuracy / validation_accuracy => 0.46 / 0.44 for step 9\n",
      "training_accuracy / validation_accuracy => 0.40 / 0.52 for step 10\n",
      "training_accuracy / validation_accuracy => 0.54 / 0.54 for step 20\n",
      "training_accuracy / validation_accuracy => 0.70 / 0.70 for step 30\n",
      "training_accuracy / validation_accuracy => 0.62 / 0.68 for step 40\n",
      "training_accuracy / validation_accuracy => 0.76 / 0.76 for step 50\n",
      "training_accuracy / validation_accuracy => 0.76 / 0.74 for step 60\n",
      "training_accuracy / validation_accuracy => 0.88 / 0.74 for step 70\n",
      "training_accuracy / validation_accuracy => 0.88 / 0.80 for step 80\n",
      "training_accuracy / validation_accuracy => 0.80 / 0.84 for step 90\n",
      "training_accuracy / validation_accuracy => 0.80 / 0.84 for step 100\n",
      "training_accuracy / validation_accuracy => 0.94 / 0.88 for step 200\n",
      "training_accuracy / validation_accuracy => 0.92 / 0.88 for step 300\n",
      "training_accuracy / validation_accuracy => 0.90 / 0.90 for step 400\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.90 for step 500\n",
      "training_accuracy / validation_accuracy => 0.92 / 0.92 for step 600\n",
      "training_accuracy / validation_accuracy => 0.86 / 0.92 for step 700\n",
      "training_accuracy / validation_accuracy => 0.96 / 0.92 for step 800\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.92 for step 900\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.92 for step 1000\n",
      "training_accuracy / validation_accuracy => 0.96 / 0.94 for step 2000\n",
      "training_accuracy / validation_accuracy => 1.00 / 0.96 for step 3000\n",
      "training_accuracy / validation_accuracy => 1.00 / 0.96 for step 4000\n",
      "training_accuracy / validation_accuracy => 1.00 / 0.94 for step 5000\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.98 for step 6000\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.98 for step 7000\n",
      "training_accuracy / validation_accuracy => 1.00 / 0.98 for step 8000\n",
      "training_accuracy / validation_accuracy => 1.00 / 0.98 for step 9000\n",
      "training_accuracy / validation_accuracy => 0.98 / 0.98 for step 10000\n",
      "training_accuracy / validation_accuracy => 1.00 / 1.00 for step 19999\n"
     ]
    }
   ],
   "source": [
    "# visualisation variables\n",
    "train_accuracies = []\n",
    "validation_accuracies = []\n",
    "x_range = []\n",
    "\n",
    "display_step=1\n",
    "\n",
    "for i in range(TRAINING_ITERATIONS):\n",
    "\n",
    "    #get new batch\n",
    "    batch_xs, batch_ys = next_batch(BATCH_SIZE)        \n",
    "\n",
    "    # check progress on every 1st,2nd,...,10th,20th,...,100th... step\n",
    "    if i%display_step == 0 or (i+1) == TRAINING_ITERATIONS:\n",
    "        \n",
    "        train_accuracy = accuracy.eval(feed_dict={x:batch_xs, \n",
    "                                                  y_: batch_ys, \n",
    "                                                  keep_prob: 1.0})       \n",
    "        if(VALIDATION_SIZE):\n",
    "            validation_accuracy = accuracy.eval(feed_dict={x: validation_images[0:BATCH_SIZE], \n",
    "                                                            y_: validation_labels[0:BATCH_SIZE], \n",
    "                                                            keep_prob: 1.0})                                  \n",
    "            print('training_accuracy / validation_accuracy => %.2f / %.2f for step %d'%(train_accuracy, validation_accuracy, i))\n",
    "            \n",
    "            validation_accuracies.append(validation_accuracy)\n",
    "            x_range.append(i)\n",
    "        else:\n",
    "             print('training_accuracy => %.4f for step %d'%(train_accuracy, i))\n",
    "        train_accuracies.append(train_accuracy)\n",
    "        \n",
    "        # increase display_step\n",
    "        if i%(display_step*10) == 0 and i:\n",
    "            display_step *= 10\n",
    "    # train on batch\n",
    "    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys, keep_prob: DROPOUT})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After training is done, it's good to check accuracy on data that wasn't used in training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "validation_accuracy => 0.99\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x129979e80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# check final accuracy on validation set  \n",
    "if(VALIDATION_SIZE):\n",
    "    validation_accuracy = accuracy.eval(feed_dict={x: validation_images, y_: validation_labels, keep_prob: 1.0})\n",
    "    print('validation_accuracy => %.2f'%validation_accuracy)\n",
    "    plt.plot(x_range, train_accuracies,'-b', label='Training')\n",
    "    plt.plot(x_range, validation_accuracies,'-g', label='Validation')\n",
    "    plt.legend(loc='lower right', frameon=False)\n",
    "    plt.ylim(ymax = 1.1, ymin = 0.7)\n",
    "    plt.ylabel('accuracy')\n",
    "    plt.xlabel('step')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When, we're happy with the outcome, we read test data from **`test.csv`** and predict labels for provided images.\n",
    "\n",
    "Test data contains only images and labels are missing. Otherwise, the structure is similar to training data.\n",
    "\n",
    "Predicted labels are stored into CSV file for future submission."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_images(28000,784)\n",
      "predicted_lables(28000)\n",
      "predicted_lables[10] => 5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11ccfba90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# read test data from CSV file \n",
    "test_images = pd.read_csv('./input/test.csv').values\n",
    "test_images = test_images.astype(np.float)\n",
    "\n",
    "# convert from [0:255] => [0.0:1.0]\n",
    "test_images = np.multiply(test_images, 1.0 / 255.0)\n",
    "\n",
    "print('test_images({0[0]},{0[1]})'.format(test_images.shape))\n",
    "\n",
    "\n",
    "# predict test set\n",
    "predicted_lables = predict.eval(feed_dict={x: test_images, keep_prob: 1.0})\n",
    "\n",
    "print('predicted_lables({0})'.format(len(predicted_lables)))\n",
    "\n",
    "# output test image and prediction\n",
    "display(test_images[IMAGE_TO_DISPLAY])\n",
    "print ('predicted_lables[{0}] => {1}'.format(IMAGE_TO_DISPLAY,predicted_lables[IMAGE_TO_DISPLAY]))\n",
    "\n",
    "# save results\n",
    "np.savetxt('submission_softmax.csv', \n",
    "           np.c_[range(1,len(test_images)+1),predicted_lables], \n",
    "           delimiter=',', \n",
    "           header = 'ImageId,Label', \n",
    "           comments = '', \n",
    "           fmt='%d')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Appendix\n",
    "As it was mentioned before, it is good to output some variables for a better understanding of the process. \n",
    "\n",
    "Here we pull an output of the first convolution layer from TensorFlow graph. 32 features are transformed into an image grid, and it's quite interesting to see how filters picked by NN outline characteristics of different digits."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x129979ac8>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n4wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1299799e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "layer1_grid = layer1.eval(feed_dict={x: test_images[IMAGE_TO_DISPLAY:IMAGE_TO_DISPLAY+1], keep_prob: 1.0})\n",
    "plt.axis('off')\n",
    "plt.imshow(layer1_grid[0], cmap=cm.seismic )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sess.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
